package com.spzx.product.api.factory;

import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.product.api.RemoteBrandService;
import com.spzx.product.api.domain.Brand;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.List;

//@Slf4j
@Component
/**
 * 实现FallbackFactory接口，用于创建RemoteBrandService的回退实例
 * 当RemoteBrandService调用失败时，会使用本工厂产生的实例作为回退机制
 */
public class RemoteBrandFallbackFactory implements FallbackFactory<RemoteBrandService> {
    // 日志对象，用于记录错误信息
    private static final Logger log = LoggerFactory.getLogger(RemoteBrandFallbackFactory.class);

    /**
     * 创建RemoteBrandService的回退实例
     *
     * @param throwable 引发回退的异常，用于记录错误信息
     * @return 返回一个RemoteBrandService的实现，该实现会返回失败信息
     */
    @Override
    public RemoteBrandService create(Throwable throwable) {
        // 记录错误日志，指示服务调用失败
        log.error("商品服务【{}】调用失败:{}", ServiceNameConstants.PRODUCT_SERVICE, throwable.getMessage());

        // 返回一个匿名内部类实例，重写getBrandAllList方法
        // 该实例在调用时会返回失败信息，避免因服务调用失败导致的系统崩溃
        return new RemoteBrandService() {
            @Override
            public R<List<Brand>> getBrandAllList(String source) {
                // 返回失败信息，指示获取品牌列表失败
                return R.fail("获取全部品牌失败:" + throwable.getMessage());
            }
        };
    }
}
